package com.example.thread.base.demo2;

/**
 * @author LiYuhang
 * @version 0.1
 * @application
 * @Date 2020/8/14 10:50
 */

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 底层：FinalizableDelegatedExecutorService包装的ThreadPoolExecutor实例，corePoolSize为1；maximumPoolSize为1；
 * keepAliveTime为0L；unit为：TimeUnit.MILLISECONDS；workQueue为：new LinkedBlockingQueue<Runnable>() 无解阻塞队列
 * 通俗：创建只有一个线程的线程池，且线程的存活时间是无限的；当该线程正繁忙时，对于新任务会进入阻塞队列中(无界的阻塞队列)
 * 适用：一个任务一个任务执行的场景
 */
@Slf4j()
public class SingleThreadExecutor {

    /**
     * *创建一个单线程化的线程池，它只会用唯一的工作线程来执行任务，保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
     *
     * @param limit
     */
    public static void singleTheadPool(Integer limit) {

        ExecutorService executorService = Executors.newSingleThreadExecutor();
        for (int i = 0; i < limit; i++) {
            int finalI = i;
            executorService.execute(() -> {
                log.info("线程名称：{}，执行{}",Thread.currentThread().getName(),finalI);
            });
        }
        executorService.shutdown();
    }
}
